#include<bits/stdc++.h>
using namespace std;
struct T{
	int r,k;
};
int pow(int A,int x)
{
	int C=1;
	for(int i=0;i<x;i++)
	{
		C*=A;
	}
	return C;
}
int uppermod(int x)
{
	for(int i=0;i<=30;i++)
	{
		if(pow(2,i)>=x) return i;
	}
	return 31;
}
bool cmp(T A,T B)
{
	return A.r>B.r;
}
int main()
{
	freopen("arena.in","r",stdin);
	freopen("arena.out","w",stdout);
	int n,m;
	cin>>n>>m;
	int al[n+3];
	T c[m+3];
	for(int i=0;i<n;i++)
	{
		cin>>al[i];
	}
	for(int j=1;j<=m;j++)
	{
		cin>>c[j].r;
		c[j].k=j;
	}
	int k=uppermod(n);
	bool d[k+3][n];
	for(int i=0;i<k;i++)
	{
		for(int j=0;j<pow(2,k-i-1);j++)
		{
			char p;
			cin>>p;
			d[i][j]=p-48;
		}
	}
	sort(c+1,c+m+1,cmp);
	n=pow(2,uppermod(n)-1);
	int t;
	cin>>t;
	while(t--)
	{
		int xorans=0;
		int x[4];
		cin>>x[0]>>x[1]>>x[2]>>x[3];
		T a[n+3];
		for(int i=0;i<n;i++)
		{
			a[i].r=al[i] xor x[i%4];
			a[i].k=i;
		}
		vector<T> p,q;
		for(int i=0;i<n;i++)
		{
			p.push_back(a[i]);
		}
		int tot=0;
		for(;c[tot].r==1;tot++)
		{
			xorans=xorans xor (c[tot].k);
			if(tot+1>m) break;
		}
		int S=n;
		do
		{
			S/=2;
			vector<T> s;
			int G=n;
			int H=k-uppermod(G)+1;
			for(int i=0;i<G/2;i++)
			{
				int X=i*2+1,Y=i*2+2;
				if(d[H][i+1])
				{
					if(a[Y].r>=H) s.push_back(a[Y]);
					else s.push_back(a[X]);
				}
				else
				{
					if(a[X].r>=H) s.push_back(a[X]);
					else s.push_back(a[Y]);
				}
			}
			p=s;
			q=s;
			for(;c[tot].r==pow(2,H);tot++)
			{
				xorans=xorans xor (c[tot].k*q[0].k);
				if(tot+1>m) break;
			}
		}while(S>1);
		cout<<xorans<<endl;
	}
	return 0;
}
